package veterinaria.manager;

import geral.manager.GenericManager;
import geral.manager.UtilManager;
import geral.util.FacesUtil;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import paginacao.ListaPaginada;
import br.com.sgc.entities.cep.Cidade;
import br.com.sgc.entities.cep.UF;
import br.com.sgc.entities.geral.Cliente;
import br.com.sgc.entities.geral.Endereco;
import br.com.sgc.entities.geral.PessoaFisica;
import br.com.sgc.entities.geral.Telefone;
import br.com.sgc.enuns.TipoOrdenacao;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.session.ClienteSession;
import br.com.sgc.session.PessoaFisicaSession;

@Named
@ConversationScoped
public class ClienteManager extends GenericManager implements Serializable {

	private static final long serialVersionUID = -8569283696652436951L;
	
	@Inject private UtilManager utilManager;
	
	@EJB private ClienteSession clienteSession;
	
	@EJB private PessoaFisicaSession pessoaFisicaSession;
	
	private Cliente cliente = new Cliente();
	
	private Cliente clienteSearch = new Cliente();
	
	private List<Cliente> clientes = new ArrayList<Cliente>();
	
	
	private Boolean showPanelCadastro;

	private Boolean isCpfValido;
	
	
	public String list(){
		clienteSearch = new Cliente();
		clienteSearch.setPessoa(new PessoaFisica());
		search();
		showPanelCadastro = false;
		return "formCliente";
	}
	
	public void search(){
		clientes = new ListaPaginada<Cliente>(clienteSession, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(), clienteSearch, 5, "id", TipoOrdenacao.DESC);
		showPanelCadastro = false;
	}
	
	public String prepareSave(){
		showPanelCadastro = true;
		isCpfValido = false;
		cliente = new Cliente();
		cliente.setPessoa(new PessoaFisica());
		cliente.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		cliente.getPessoa().setClinica(cliente.getClinica());
		
		clienteSearch = new Cliente();
		clienteSearch.setPessoa(new PessoaFisica());
		utilManager.getAnimalManager().prepareSave();
		utilManager.getAnimalManager().setCliente(cliente);
		return "formCliente";
	}
	
	public String save(){
		try {
			cliente.setAnimal(utilManager.getAnimalManager().getAnimais());
			cliente.getPessoa().setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().prepareDependecies(utilManager.getEnderecoManager().getListEndereco(), cliente.getPessoa()));
			cliente.getPessoa().setTelefones(utilManager.getTelefoneManager().getTelefoneSession().prepareDependecies(utilManager.getTelefoneManager().getListTelefone(), cliente.getPessoa()));
			clienteSession.save(cliente);
			FacesUtil.mensInfo("Cliente salvo com sucesso");
			cliente = new Cliente();
			return list();
		} catch (Exception e) {
			FacesUtil.mensErro(e.getMessage());
			return null;
		}
	}
	
	public String prepareUpdate(){
		fillCliente();
		return "formCliente";
	}
	
	public String update(){
		try {
			cliente.setAnimal(utilManager.getAnimalManager().getAnimais());
			cliente.getPessoa().setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().prepareDependecies(utilManager.getEnderecoManager().getListEndereco(), cliente.getPessoa()));
			cliente.getPessoa().setTelefones(utilManager.getTelefoneManager().getTelefoneSession().prepareDependecies(utilManager.getTelefoneManager().getListTelefone(), cliente.getPessoa()));
			cliente.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
			clienteSession.update(cliente);
			cliente = new Cliente();
			FacesUtil.mensInfo("Cliente atualizado com sucesso");
			return list();
		} catch (Exception e) {
			FacesUtil.mensErro(e.getMessage());
			return null;
		}
	}
	
	
	public void validateCpf() {
		try {
			isCpfValido = false;
			clienteSession.validarCPF(cliente.getPessoa().getDisplayDocumento());
			
			utilManager.getEnderecoManager().setRenderPanelLogradouro(false);
			utilManager.getEnderecoManager().setListCidade(new ArrayList<Cidade>());
			utilManager.getEnderecoManager().setListUF(new ArrayList<UF>());
			utilManager.getEnderecoManager().setRenderPanelCadastro(true);
			utilManager.getTelefoneManager().setRenderPanelCadastro(true);
			
			utilManager.getTelefoneManager().getListTelefone().clear();
			utilManager.getTelefoneManager().setTelefone(new Telefone());
			
			utilManager.getEnderecoManager().setEndereco(new Endereco());
			utilManager.getEnderecoManager().getListEndereco().clear();
			
			utilManager.getEnderecoManager().setListEndereco(cliente.getPessoa().getEnderecos());
			utilManager.getTelefoneManager().setListTelefone(cliente.getPessoa().getTelefones());
			
			isCpfValido = true;

		} catch (ValidacaoException e) {
			FacesUtil.mensWarn(e.getMessage());
		}
	}

	public void fillCliente(){
		cliente = clienteSession.findById(Cliente.class, cliente.getId(), true);
		cliente.setPessoa(pessoaFisicaSession.findById(PessoaFisica.class, cliente.getPessoa().getId(), true));
		cliente.getPessoa().setEnderecos(utilManager.getEnderecoManager().getEnderecoSession().getEnderecosPersistent(cliente.getPessoa().getEnderecos()));
		cliente.getPessoa().setTelefones(utilManager.getTelefoneManager().getTelefoneSession().getTelefonesPersistent(cliente.getPessoa().getTelefones()));
		utilManager.getEnderecoManager().setListEndereco(cliente.getPessoa().getEnderecos());
		utilManager.getEnderecoManager().setRenderPanelCadastro(true);
		utilManager.getTelefoneManager().setListTelefone(cliente.getPessoa().getTelefones());
		utilManager.getTelefoneManager().setRenderPanelCadastro(true);
		
		showPanelCadastro = true;
		isCpfValido = true;
		
		utilManager.getAnimalManager().prepareSave();
		utilManager.getAnimalManager().setAnimais(utilManager.getAnimalManager().getAnimalSession().findAllByCliente(cliente));
	}

	public ClienteSession getClienteSession() {
		return clienteSession;
	}

	public void setClienteSession(ClienteSession clienteSession) {
		this.clienteSession = clienteSession;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public Boolean getShowPanelCadastro() {
		return showPanelCadastro;
	}

	public void setShowPanelCadastro(Boolean showPanelCadastro) {
		this.showPanelCadastro = showPanelCadastro;
	}

	public Boolean getIsCpfValido() {
		return isCpfValido;
	}

	public void setIsCpfValido(Boolean isCpfValido) {
		this.isCpfValido = isCpfValido;
	}

	public Cliente getClienteSearch() {
		return clienteSearch;
	}

	public void setClienteSearch(Cliente clienteSearch) {
		this.clienteSearch = clienteSearch;
	}
}
